<?php

/**
 * 
 * @author yuxun
 *
 */
class CodeService extends Service {
	
	/**
	 * -1 签名错误或请求超时
	 * 11 参数不完整
	 * 12 激活码不存在
	 * 13 渠道不存在
	 * 14 激活码所属的码池不存在
	 * 15 激活码已经被使用（普通礼包的情况下）
	 * 16 激活码的使用时间还未到
	 * 17 激活码已经过期
	 * 18 等级不符合
	 * 19 激活码code不在这个渠道下channel_id,就是激活码跟渠道对不上
	 * 20 同账号不可以领取，即该账号已经在该码池领取过一次了	
	 * 21 同角色不可以领取，即该角色已经在该码池领取过一次了
	 * 22 重复时间领取限制（同账号可领取（可以） 同角色可领取（不可以），并且设置重复领取的时间限制，此处就是时间还没有过限制的那个时间数）
	 * 23 重复时间领取限制（同账号可领取（可以） 同角色可领取（可以），并且设置重复领取的时间限制，此处就是时间还没有过限制的那个时间数）
	 * 24 激活码所属码池已经关闭（状态是关闭，不能使用）
	 * @param unknown $channel_id
	 * @param unknown $account
	 * @param unknown $role_id
	 * @param unknown $grade
	 * @param unknown $code
	 * @return multitype:number string
	 */
	public static function check($channel_id,$account,$role_id,$grade,$code){
		if($channel_id == ''){
			$json_arr = array('errcode'=>11,'msg'=>'need to parameter channel_id','data'=>'');
			return $json_arr;
		}
		 
		if($account == ''){
			$json_arr = array('errcode'=>11,'msg'=>'need to parameter account','data'=>'');
			return $json_arr;
		}
		 
		if($role_id == ''){
			$json_arr = array('errcode'=>11,'msg'=>'need to parameter role_id','data'=>'');
			return $json_arr;
		}
		 
		if($grade == ''){
			$json_arr = array('errcode'=>11,'msg'=>'need to parameter grade','data'=>'');
			return $json_arr;
		}
		 
		if($code == ''){
			$json_arr = array('errcode'=>11,'msg'=>'need to parameter code','data'=>'');
			return $json_arr;
		}
		
		//先在code表查询是否有该激活码
		$modCode = new ModCode();
		$code_obj = $modCode->findByAttributes(array('code_number' => $code));
		if($code_obj){
			$code_info = $code_obj->getAttributes();
		}else{
			$json_arr = array('errcode'=>12,'msg'=>'code '.$code.' is not found','data'=>'');
			return $json_arr;
		}
		
		//激活码存在时，判断该码是普通礼包还是通用礼包，普通礼包只能使用一次，通用礼包可以无限使用
		if($code_info['classify'] == 1 && $code_info['is_use'] == 2){  //普通礼包且已经被使用
			$json_arr = array('errcode'=>15,'msg'=>'code '.$code.' Has been used','data'=>'');
			return $json_arr;
		}
		
		$pool_id = $code_info['pool_id']; //码池
		 
		//查询渠道id
		$modChannel = new ModChannel();
		$channel_obj = $modChannel->findByAttributes(array('game'=>'mango','tab' => $channel_id));
		if($channel_obj){
			$channel_info = $channel_obj->getAttributes();
		}else{
			$json_arr = array('errcode'=>13,'msg'=>'channel_id '.$channel_id.' is not found','data'=>'');
			return $json_arr;
		}
		$channel = $channel_info['id'];
		
		
		//查询码池的信息
		$modCodePool = new ModCodePool();
		$code_pool_obj = $modCodePool->findByPk($pool_id);
		if($code_pool_obj){
			$code_pool_info = $code_pool_obj->getAttributes();
		}else{
			$json_arr = array('errcode'=>14,'msg'=>'codePool is not found','data'=>'');
			return $json_arr;
		}
		
		//查询该码池的渠道,分两种情况，2全渠道，1非全渠道
		//全渠道不用判断激活码与渠道关系是否对的上
		if($code_pool_info['is_all_channel'] == 1){  //1非全渠道
			$modCodePoolChannel = new ModCodePoolChannel();
			$channel_list = $modCodePoolChannel->selectChannel($pool_id);
			$channel_array = array();
			foreach ($channel_list as $key=>$val){
				$channel_array[] = $val['channel_id'];
			}
			if(!in_array($channel, $channel_array)){
				$json_arr = array('errcode'=>19,'msg'=>'is no '.$code.' code under the channel '.$channel_id,'data'=>'');
				return $json_arr;
			}
		}

		
		
		
		//判断码池的状态
		if($code_pool_info['status'] == 2){
			$json_arr = array('errcode'=>24,'msg'=>'code_pool the status is close'.$channel_id,'data'=>'');
			return $json_arr;
		}
		
		
		//判断激活码是否在有效时间内
		$now_time = time();
		$start_time = $code_pool_info['start_time'];
		$end_time = $code_pool_info['end_time'];
		if($now_time < $start_time && $start_time != 0){
			$json_arr = array('errcode'=>16,'msg'=>'code is not yet available','data'=>'');
			return $json_arr;
		}
		if($now_time > $end_time && $end_time != 0){
			$json_arr = array('errcode'=>17,'msg'=>'code is already invalidated','data'=>'');
			return $json_arr;
		}
		
		//判断等级是否符合
		$limit_grade = $code_pool_info['limit_grade'];
		if($grade < $limit_grade && $limit_grade != 0 ){
			$json_arr = array('errcode'=>18,'msg'=>'the code is need more than '.$limit_grade.' levels before you can use it.','data'=>'');
			return $json_arr;
		}
		
		$modCodeUseLog = new ModCodeUseLog();
		$is_same_accoun = $code_pool_info['is_same_accoun'];
		$is_same_role = $code_pool_info['is_same_role'];
		
		if($is_same_accoun == 1){  // 同账号不可以领取，此时不需判断 同角色是否可以领取、重复领取时间限制
			//记录表查询code所属码池是否有该账号使用了激活码,存在则不可以用，返回
			$codeUseLogList_obj1 = $modCodeUseLog->findAllByAttributes(array('pool_id' => $pool_id,'use_account'=>$account));
			if($codeUseLogList_obj1){
				$json_arr = array('errcode'=>20,'msg'=>'no account can be received','data'=>'');
				return $json_arr;
			}
			//因为同个账号下的角色都不能领取了，所以无需判断时间限制
		}
		
		$limit_time = $code_pool_info['limit_time'];
		if($is_same_accoun == 2 && $is_same_role == 1){ //同账号可领取（可以） 同角色可领取（不可以）则其他角色可以领取
			//记录表查询code所属码池是否有该角色使用了激活码,存在则不可以用，返回
			$codeUseLogList_obj2 = $modCodeUseLog->findAllByAttributes(array('pool_id' => $pool_id,'use_role'=>$role_id));
			if($codeUseLogList_obj2){
				$json_arr = array('errcode'=>21,'msg'=>'no role can be received','data'=>'');
				return $json_arr;
			}
			//因为其他角色还可以领取，所以要判断limit_time，获取这个账号下领取中的最新时间
			$codeUseLogList_array = $modCodeUseLog->selectPoolAccount($pool_id,$account);
			//有人使用了则要判断时间，没有使用记录就不用
			if(count($codeUseLogList_array) != 0 && $limit_time != 0){ //已经有使用记录且重复时间限制
				$use_time = $codeUseLogList_array[0]['use_time'];
				$us_m = $limit_time * 60;
				$al_m = number_format((time() -  $use_time) / 60,2);
				if($al_m < $us_m){
					$json_arr = array('errcode'=>22,'msg'=>'repeat time limit,','data'=>'');
					return $json_arr;
				}	
			}
		}
		
		if($is_same_accoun == 2 && $is_same_role == 2){ //同账号可领取（可以） 同角色可领取（可以）则其他角色，账号可以领取
			//因为其他角色还可以领取，所以要判断limit_time，获取这个账号下领取中的最新时间
			$codeUseLogList_array = $modCodeUseLog->selectPoolAccount($pool_id,$account);
			//有人使用了则要判断时间，没有使用记录就不用
			if(count($codeUseLogList_array) != 0 && $limit_time != 0){ //已经有使用记录且重复时间限制
				$use_time = $codeUseLogList_array[0]['use_time'];
				$us_m = $limit_time * 60;
				$al_m = number_format((time() -  $use_time) / 60,2);
				if($al_m < $us_m){
					$json_arr = array('errcode'=>23,'msg'=>'repeat time limit','data'=>'');
					return $json_arr;
				}
			}
		}
		
		//记录使用日志，普通礼包还需更新code表
		self::doLog($pool_id, $code_info['id'], $code, $code_pool_info['classify'], $channel, $account, $role_id, $grade);
		
		if($code_pool_info['classify'] == 1){
			$update = array();
			$update['is_use'] = 2;
			$update['use_user'] = $role_id;
			$update['use_time']  = time();
			$modCode->updateByPk($code_info['id'], $update);
		}
		$data = array();
		$data['gift_id'] = $code_pool_info['bag_id'];
		$json_arr = array('errcode'=>0,'msg'=>'success','data'=>$data);
		return $json_arr;
		
		
	}
	
	
	public static function doLog($pool_id, $code_id, $code_number, $classify, $channel_id, $use_account, $use_role, $use_grade){
		$array = array(
				'pool_id'       => $pool_id,
				'code_id'       => $code_id,
				'code_number'   => $code_number,
				'classify'      => $classify,
				'channel_id'    => $channel_id,
				'use_account'   => $use_account,
				'use_role'      => $use_role,
				'use_grade'     => $use_grade,
				'use_time'      => time()
		);

		$modCodeUseLog = new ModCodeUseLog();
		$modCodeUseLog->setAttributes($array, false);
		$modCodeUseLog->save();
	}

}